package cn.tsingmo.otproxy;

import cn.tsingmo.otproxy.client.TcpProxyClient;
import cn.tsingmo.otproxy.server.TcpProxyServer;
import cn.tsingmo.otproxy.security.SecurityProviderInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * OTProxy主应用程序类
 * 负责解析命令行参数并启动服务端或客户端模式
 */
public class OtProxyApplication {
    // 日志记录器
    private static final Logger logger = LoggerFactory.getLogger(OtProxyApplication.class);
    // 默认端口号
    private static final int DEFAULT_PORT = 9250;

    /**
     * 程序入口方法
     * @param args 命令行参数：第一个参数为模式(server/client)，第二个参数为端口号
     */
    public static void main(String[] args) {
        try {
            // 初始化安全提供器（如Bouncy Castle）
            SecurityProviderInitializer.initialize();

            // 验证命令行参数
            if (args.length < 1) {
                logger.error("请指定运行模式: server 或 client");
                printUsage();
                return;
            }

            // 解析运行模式
            String mode = args[0];

            // 根据模式启动服务端或客户端
            if ("server".equalsIgnoreCase(mode)) {
                // 服务端模式参数处理
                int port = DEFAULT_PORT;
                if (args.length > 1) {
                    try {
                        port = Integer.parseInt(args[1]);
                    } catch (NumberFormatException e) {
                        logger.error("端口号必须是整数");
                        printUsage();
                        return;
                    }
                }
                logger.info("启动OTProxy，模式: {}, 端口: {}", mode, port);
                new TcpProxyServer(port).start();
            } else if ("client".equalsIgnoreCase(mode)) {
                // 客户端模式参数处理
                if (args.length < 3) {
                    logger.error("客户端模式需要提供代理服务器地址和目标服务器地址");
                    printUsage();
                    return;
                }

                // 解析代理服务器地址
                String[] proxyParts = args[1].split(":");
                if (proxyParts.length != 2) {
                    logger.error("代理服务器地址格式错误，应为host:port");
                    return;
                }
                String proxyHost = proxyParts[0];
                int proxyPort;
                try {
                    proxyPort = Integer.parseInt(proxyParts[1]);
                } catch (NumberFormatException e) {
                    logger.error("代理服务器端口必须是整数");
                    return;
                }

                // 解析目标服务器地址
                String[] targetParts = args[2].split(":");
                if (targetParts.length != 2) {
                    logger.error("目标服务器地址格式错误，应为host:port");
                    return;
                }
                String targetHost = targetParts[0];
                int targetPort;
                try {
                    targetPort = Integer.parseInt(targetParts[1]);
                } catch (NumberFormatException e) {
                    logger.error("目标服务器端口必须是整数");
                    return;
                }

                logger.info("启动OTProxy，模式: {}, 代理服务器: {}:{}", mode, proxyHost, proxyPort);
                new TcpProxyClient(proxyHost, proxyPort, targetHost, targetPort).start();
            } else {
                logger.error("不支持的运行模式: {}", mode);
                printUsage();
            }
        } catch (Exception e) {
            logger.error("程序启动失败", e);
            System.exit(1);
        }
    }

    /**
     * 打印程序使用帮助信息
     */
    private static void printUsage() {
        System.out.println("使用方法:");
        System.out.println("  服务端模式: java -jar OTProxy.jar server [端口号]");
        System.out.println("  客户端模式: java -jar OTProxy.jar client [代理服务器IP:端口] [目标服务器IP:端口]");
        System.out.println("默认端口号: " + DEFAULT_PORT);
    }
}